package br.com.as.dao;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.as.dominio.Usuario;
import br.com.as.utils.HibernateUtility;

/**
 * Classe para consistencia de usuario
 * 
 * @author msante
 *
 */
public class UsuarioDAO {

	@SuppressWarnings("unchecked")
	public  List<Usuario> listar() throws Exception{
		List<Usuario> lista = null;
		Session sessao = HibernateUtility.getSession();
		Transaction tx = null;
		try {
			tx = sessao.beginTransaction();
			Query query = sessao.createQuery(" from Usuario ");		
			lista = query.list();			
			tx.commit();			
		} catch (Exception e) {			
			tx.rollback();
			throw e;
		} finally {
			sessao.close();
		}
		return lista;
	}
	
	public  void incluir(Usuario usuario) throws Exception{
		Transaction tx = null;
		Session sessao = HibernateUtility.getSession();
		try {			
			tx = sessao.beginTransaction();
			sessao.save(usuario.getEndereco());
			sessao.save(usuario.getContato());
			sessao.save(usuario);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			sessao.close();
			throw e;
		}finally{
			sessao.close();	
		}
	}
	
	public  void alterar(Usuario usuario) throws Exception{
		Transaction tx = null;
		Session sessao = HibernateUtility.getSession();
		try {			
			tx = sessao.beginTransaction();
			sessao.saveOrUpdate(usuario.getEndereco());
			sessao.saveOrUpdate(usuario.getContato());
			sessao.update(usuario);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			sessao.close();
			throw e;
		}finally{
			sessao.close();	
		}
	}

	public void excluir(Usuario usuario) throws Exception{
		Transaction tx = null;
		Session sessao = HibernateUtility.getSession();
		try {			
			tx = sessao.beginTransaction();
			sessao.delete(usuario);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			sessao.close();
			throw e;
		}finally{
			sessao.close();	
		}
	}

	public  Usuario consultar(String cpf) throws Exception{
		Usuario usuario = null;
		Session sessao = HibernateUtility.getSession();
		Transaction tx = null;
		try {
			tx = sessao.beginTransaction();
			Query query = sessao.createQuery("from Usuario cli where cli.cpf =:cpf");		
			query.setString("cpf", cpf);
			usuario = (Usuario) query.uniqueResult();			
			tx.commit();			
		} catch (Exception e) {			
			tx.rollback();
			throw e;
		} finally {
			sessao.close();
		}
		return usuario;		
	}

	public Usuario consultar(String login, String senha) throws Exception{
		Usuario usuario = null;
		Session sessao = HibernateUtility.getSession();
		Transaction tx = null;
		try {
			tx = sessao.beginTransaction();
			Query query = sessao.createQuery("from Usuario cli where cli.login =:login and cli.senha =:senha ");		
			query.setString("login", login);
			query.setString("senha", senha);
			usuario = (Usuario) query.uniqueResult();			
			tx.commit();			
		} catch (Exception e) {			
			tx.rollback();
			throw e;
		} finally {
			sessao.close();
		}
		return usuario;		
	}
	
}
